
/**
 * 按照固定的时间频率，执行某些定时任务
 */
class SmartInterval {

    /**
     * 按照固定的时间频率，执行某些定时任务
     *
     * @param call {function} 回调函数
     * @param timeout {number} 时间间隔
     */
    constructor(call, timeout) {
        this.call = call;
        this.timeout = timeout;
        this.interval = undefined;
    }

    /**
     * 设置时间间隔
     *
     * @param t{number}  时间间隔
     */
    setTimeout(t) {
        this.timeout = t;
    }

    /**
     * 获取超时时间
     *
     * @return {number}
     */
    getTimeout() {
        return this.timeout;
    }

    /**
     * 暂停
     *
     * @returns void
     */
    parse() {
        if (this.interval !== undefined) {
            window.clearInterval(this.interval);
            this.interval = undefined;
        }
    }

    /**
     * 启动任务
     *
     * @returns void
     */
    start() {
        this.interval = window.setInterval(this.call, this.timeout);
    }

    /**
     * 是否在跑批中
     *
     * @return {boolean}
     */
    isRunning() {
        return this.interval !== undefined;
    }
}

/**
 * 带倒计时功能的循环任务
 */
class CountdownInterval {
    /**
     * 带倒计时功能的循环任务
     *
     * @param call {function} 回调函数
     * @param timeout {number} 时间间隔
     * @param times {number} 执行次数
     */
    constructor(call, timeout, times) {
        this.call = call;
        this.timeout = timeout;
        this.times = times;
        this.n = times;
        this.interval = undefined;
    }

    /**
     * 调用一次作业
     *
     * @returns void
     */
    work() {
        if (this.interval !== undefined) {
            if (this.n > 0) {
                this.call(this.n);
                this.n--;
            } else {
                window.clearInterval(this.interval);
                this.interval = undefined;
            }
        }
    }

    /**
     * 设置时间间隔
     *
     * @param t{number}  时间间隔
     */
    setTimeout(t) {
        this.timeout = t;
    }

    /**
     * 获取超时时间
     *
     * @return {number}
     */
    getTimeout() {
        return this.timeout;
    }
    /**
     * 启动任务
     *
     * @returns void
     */
    start() {
        if (this.n > 0) {
            this.interval = window.setInterval(this.work, this.timeout);
        }
    }

    /**
     * 重启任务
     *
     * @returns void
     */
    restart() {
        this.n = this.times;
        this.interval = window.setInterval(this.work, this.timeout);
    }

    /**
     * 暂停
     *
     * @returns void
     */
    parse() {
        if (this.interval !== undefined) {
            window.clearInterval(this.interval);
            this.interval = undefined;
        }
    }

    /**
     * 恢复执行
     *
     * @returns void
     */
    resume() {
        this.start();
    }

    /**
     * 是否在跑批中
     *
     * @return {boolean}
     */
    isRunning() {
        return this.interval !== undefined;
    }
}

/**
 * 在一个数值区间内，按照固定的时间频率，执行某些定时任务
 */
class RangeInterval {
    /**
     * 在一个数值区间内，按照固定的时间频率，执行某些定时任务
     *
     * @param call {function} 回调函数
     * @param timeout {number} 时间间隔
     */
    constructor(call, timeout) {
        this.call = call;
        this.timeout = timeout;
        this.interval = undefined;
        this.range = [0, 0];
        this.idx = 0;
    }

    /**
     * 调用一次作业
     *
     * @returns void
     */
    work() {
        if (this.interval !== undefined) {
            if (this.idx < this.range[1]) {
                this.call(this.idx);
                this.idx++;
            } else {
                window.clearInterval(this.interval);
                this.interval = undefined;
            }
        }
    }

    /**
     * 设置区间
     *
     * @param r{[]}  区间
     */
    setRange(r) {
        this.range = r;
        this.idx = r[0];
    }

    /**
     * 设置时间间隔
     *
     * @param t{number}  时间间隔
     */
    setTimeout(t) {
        this.timeout = t;
    }

    /**
     * 获取超时时间
     *
     * @return {number}
     */
    getTimeout() {
        return this.timeout;
    }

    /**
     * 暂停
     *
     * @returns void
     */
    parse() {
        if (this.interval !== undefined) {
            window.clearInterval(this.interval);
            this.interval = undefined;
        }
    }

    /**
     * 启动任务
     *
     * @returns void
     */
    start() {
        if (this.idx < this.range[1]) {
            this.interval = window.setInterval(this.work, this.timeout);
        }
    }

    /**
     * 重启任务
     *
     * @returns void
     */
    restart() {
        this.idx = this.range[0];
        this.interval = window.setInterval(this.work, this.timeout);
    }

    /**
     * 恢复执行
     *
     * @returns void
     */
    resume() {
        this.start();
    }

    /**
     * 是否在跑批中
     *
     * @return {boolean}
     */
    isRunning() {
        return this.interval !== undefined;
    }
}

/**
 * 增加了启停功能的定时任务，需要定期执行任务的界面，这些工具会非常有用
 *
 * 场景案例：地图上动态展示飞机的飞行路线。
 */
export default {SmartInterval, CountdownInterval, RangeInterval};